﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.OleDb;
using System.Data;

namespace CodigoProyecto {
    class Program {
        static void Main(string[] args) {
            bool seguir = true;

            while (seguir) {
                Console.WriteLine("********* Menú Principal *********");
                Console.WriteLine("Ingrese una opción:");
                Console.WriteLine("     1) Nuevo Producto o servicio");
                Console.WriteLine("     2) Listado de productos y servicios");
                Console.WriteLine("     3) Salir");
                Console.Write("Opción: ");
                ConsoleKeyInfo key = Console.ReadKey();
                Console.WriteLine();
                if (key.Key == ConsoleKey.D1) {
                    IngresoItem();
                } else if (key.Key == ConsoleKey.D2) {
                    ListadoItems();
                } else if (key.Key == ConsoleKey.D3) {
                    seguir = false;
                } else {
                    Console.WriteLine("Error de ingreso, debe ser un número de 1 a 3");
                }
            }
        }

        static void ListadoItems() {
            OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=database.accdb;Persist Security Info=False;");

            String strSQL = "Select * From Producto";

            OleDbDataAdapter dap = new OleDbDataAdapter(strSQL, con);

            DataSet dsp = new DataSet();

            con.Open();

            dap.Fill(dsp, "Producto");

            Console.WriteLine("Productos ---------------------------------------------------");
            if (dsp.Tables.Count > 0) {
                if (dsp.Tables[0].Rows.Count > 0) {
                    foreach (DataRow r in dsp.Tables[0].Rows) {
                        foreach (object o in r.ItemArray) {
                            Console.Write(o.ToString() + ", ");
                        }
                        Console.WriteLine();
                    }
                } else {
                    Console.WriteLine("No hay productos");
                }
            } else {
                Console.WriteLine("Error");
            }
            Console.WriteLine();

            dsp.Dispose();
            dap.Dispose();

            strSQL = "Select * From Servicio";

            OleDbDataAdapter das = new OleDbDataAdapter(strSQL, con);

            DataSet dss = new DataSet();

            das.Fill(dss, "servicios");

            Console.WriteLine("Servicios ---------------------------------------------------");
            if (dss.Tables.Count > 0) {
                if (dss.Tables[0].Rows.Count > 0) {
                    foreach (DataRow r in dss.Tables[0].Rows) {
                        foreach (object o in r.ItemArray) {
                            Console.Write(o.ToString() + ", ");
                        }
                        Console.WriteLine();
                    }
                } else {
                    Console.WriteLine("No hay servicios");
                }
            } else {
                Console.WriteLine("Error");
            }
            Console.WriteLine("-------------------------------------------------------------");

            dss.Dispose();
            das.Dispose();

            con.Close();
        }

        static void IngresoItem() {
            int varId = 0;
            string varNombre = "";
            int varTipo = 1;                //1=producto 2=servico
            string varDescripcion = "";
            double varPrecio = 0;
            int varDescuento = 0;
            int varImpuestos = 0;
            string varEmpaque = "";
            int varPeso = 0;
            string varColor = "Rojo";
            int varTamaño = 0;

            string ingreso;
            bool ingreso_correcto = false;
            
            bool confirma = false;
            while (!confirma) {
                Console.Write("Ingrese el id (numérico, q para cancelar): ");
                ingreso = Console.ReadLine();
                if (ingreso.ToLower() == "q") return;
                varId = int.Parse(ingreso);

                Console.Write("Ingrese el nombre (texto, q para cancelar): ");
                ingreso = Console.ReadLine();
                if (ingreso.ToLower() == "q") return;
                varNombre = ingreso;

                ingreso_correcto = false;
                while (!ingreso_correcto) {
                    Console.Write("Ingrese el tipo de ítem (1=producto 2=servicio, q para cancelar): ");
                    ingreso = Console.ReadLine();
                    if (ingreso.ToLower() == "q") return;
                    try {
                        varTipo = int.Parse(ingreso);
                        ingreso_correcto = true;
                    } catch {
                        Console.WriteLine("El valor ingresado debe estar entre 1 y 2 o q para cancelar");
                    }
                }

                Console.Write("Ingrese la descripción (texto, q para cancelar): ");
                ingreso = Console.ReadLine();
                if (ingreso.ToLower() == "q") return;
                varDescripcion = ingreso;

                ingreso_correcto = false;
                while (!ingreso_correcto) {
                    Console.Write("Ingrese el precio (decimal, q para cancelar): ");
                    ingreso = Console.ReadLine();
                    if (ingreso.ToLower() == "q") return;
                    try {
                        varPrecio = double.Parse(ingreso);
                        ingreso_correcto = true;
                    } catch {
                        Console.WriteLine("El valor ingresado debe ser decimal");
                    }
                }

                Console.Write("Ingrese posibles descuentos (texto, q para cancelar): ");
                ingreso = Console.ReadLine();
                if (ingreso.ToLower() == "q") return;
                varDescuento = int.Parse(ingreso);

                Console.Write("Ingrese los impuestos asociados (numérico, q para cancelar): ");
                ingreso = Console.ReadLine();
                if (ingreso.ToLower() == "q") return;
                varImpuestos = int.Parse(ingreso);

                Console.Write("Ingrese la descripción del empaque (texto, q para cancelar): ");
                ingreso = Console.ReadLine();
                if (ingreso.ToLower() == "q") return;
                varEmpaque = ingreso;

                Console.Write("Ingrese el peso (q para cancelar): ");
                ingreso = Console.ReadLine();
                if (ingreso.ToLower() == "q") return;
                varPeso = int.Parse(ingreso);

                while (!ingreso_correcto) {
                    Console.Write("Ingrese el color (1=Rojo 2=Blanco 3=Negro 4=Verde, q para cancelar): ");
                    ingreso = Console.ReadLine();
                    if (ingreso.ToLower() == "q") return;
                    try {
                        int color = int.Parse(ingreso);
                        if (color > 0 && color < 5) {
                            switch (color) {
                                case 1:
                                    varColor = "rojo";
                                    break;
                                case 2:
                                    varColor = "blanco";
                                    break;
                                case 3:
                                    varColor = "negro";
                                    break;
                                case 4:
                                    varColor = "verde";
                                    break;
                            }
                            ingreso_correcto = true;
                        } else {
                            Console.WriteLine("El valor ingresado debe estar entre 1 y 4 o q para cancelar");
                        }
                    } catch {
                        Console.WriteLine("El valor ingresado debe estar entre 1 y 4 o q para cancelar");
                    }
                }

                Console.Write("Ingrese el tamaño (numérico, q para cancelar): ");
                ingreso = Console.ReadLine();
                if (ingreso.ToLower() == "q") return;
                varTamaño = int.Parse(ingreso);

                ingreso_correcto = false;
                while (!ingreso_correcto) {
                    Console.Write("Confirma los datos (Si/No o q para cancelar): ");
                    ingreso = Console.ReadLine();
                    if (ingreso.ToLower() == "q") {
                        return;
                    }
                    if (ingreso.ToLower() != "si" && ingreso.ToLower() != "no") {
                        Console.WriteLine("El valor ingresado debe ser 'si' o 'no'");
                    } else {
                        ingreso_correcto = true;
                    }
                }

                Console.WriteLine("");
                if (ingreso.ToLower() == "no") {
                    return;
                }

                Console.WriteLine("Datos a ingresar:");
                Console.WriteLine("Id=" + varId.ToString());
                Console.WriteLine("Nombre=" + varNombre);
                Console.WriteLine("Tipo=" + (varTipo == 1 ? "Producto" : "Servicio"));
                Console.WriteLine("Descrición=" + varDescripcion);
                Console.WriteLine("Precio=" + varPrecio.ToString());
                Console.WriteLine("Descuento=" + varDescuento.ToString());
                Console.WriteLine("Impuestos=" + varImpuestos.ToString());
                Console.WriteLine("Empaque=" + varEmpaque.ToString());
                Console.WriteLine("Peso=" + varPeso.ToString());
                Console.WriteLine("Color=" + varColor);
                Console.WriteLine("Tamaño=" + varTamaño.ToString());

                ingreso_correcto = false;
                while (!ingreso_correcto) {
                    Console.Write("Agrega el nuevo ítem (Si/No): ");
                    ingreso = Console.ReadLine();
                    if (ingreso.ToLower() != "si" && ingreso.ToLower() != "no") {
                        Console.WriteLine("El valor ingresado debe ser 'si' o 'no'");
                    } else {
                        ingreso_correcto = true;
                    }
                }

                Console.WriteLine("");
                if (ingreso.ToLower() == "si") {
                    confirma = true;
                }
            }

            InsertarEnBD(varId, varNombre, varTipo, varDescripcion, varPrecio, varDescuento, varImpuestos, varEmpaque, varPeso, varColor, varTamaño);
        }

        static void InsertarEnBD(int varId, 
                                string varNombre, 
                                int varTipo, 
                                string varDescripcion, 
                                double varPrecio, 
                                int varDescuento, 
                                int varImpuestos, 
                                string varEmpaque, 
                                int varPeso, 
                                string varColor, 
                                int varTamaño) {
            OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=database.accdb;");
            con.Open();

            String strSQL;
            OleDbCommand cmd;

            if (varTipo == 1) {
                strSQL = "INSERT INTO `Producto` (`id`, `nombre`, `descripcion`, `precio`, `descuento`, `impuestos`, `empaque`, `peso`, `color`, `tamaño`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
                cmd = new OleDbCommand(strSQL, con);
                cmd.Parameters.Add("id", OleDbType.Numeric).Value = varId;
                cmd.Parameters.Add("nombre", OleDbType.VarChar).Value = varNombre;
                cmd.Parameters.Add("descripcion", OleDbType.VarChar).Value = varDescripcion;
                cmd.Parameters.Add("precio", OleDbType.Currency).Value = varPrecio;
                cmd.Parameters.Add("descuento", OleDbType.Numeric).Value = varDescuento;
                cmd.Parameters.Add("impuestos", OleDbType.Numeric).Value = varImpuestos;
                cmd.Parameters.Add("empaque", OleDbType.VarChar).Value = varEmpaque;
                cmd.Parameters.Add("peso", OleDbType.Numeric).Value = varPeso;
                cmd.Parameters.Add("color", OleDbType.VarChar).Value = varColor;
                cmd.Parameters.Add("tamaño", OleDbType.Numeric).Value = varTamaño;
            } else {
                strSQL = "INSERT INTO `Servicio` (`id`, `nombre`, `descripcion`, `precio`, `descuento`, `impuestos`) VALUES (?, ?, ?, ?, ?, ?)";
                cmd = new OleDbCommand(strSQL, con);
                cmd.Parameters.Add("id", OleDbType.Numeric).Value = varId;
                cmd.Parameters.Add("nombre", OleDbType.VarChar).Value = varNombre;
                cmd.Parameters.Add("descripcion", OleDbType.VarChar).Value = varDescripcion;
                cmd.Parameters.Add("precio", OleDbType.Currency).Value = varPrecio;
                cmd.Parameters.Add("descuento", OleDbType.Numeric).Value = varDescuento;
                cmd.Parameters.Add("impuestos", OleDbType.Numeric).Value = varImpuestos;
            }

            int cant = cmd.ExecuteNonQuery();

            if (cant > 0) {
                Console.WriteLine("Ingreso correcto");
            } else {
                Console.WriteLine("Ingreso no realizado");
            }

            con.Close();
        }
    }
}
